//#include <iostream>
//#include <algorithm>
//using namespace std;
//
//const int N = 110;
//
//int dx[] = { 0, 0, 1, -1 };
//int dy[] = { 1, -1, 0, 0 };
//
//struct node
//{
//	int idx;
//	int idy;
//	int val;
//};
//
//bool cmp(node& a, node& b)
//{
//	return a.val < b.val;
//}
//
//int a[N][N] = { 0 };
//int f[N][N] = { 0 };
//node mp[N * N];
//int cnt = 0;
//
//int n, m;
//
//int main()
//{
//	cin >> n >> m;
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			cin >> a[i][j];
//			mp[++cnt].idx = i;
//			mp[cnt].idy = j;
//			mp[cnt].val = a[i][j];
//		}
//	}
//
//	sort(mp + 1, mp + 1 + cnt, cmp);
//
//
//
//	int ret = 0;
//	for (int i = 1; i <= cnt; i++)
//	{
//		int x = mp[i].idx;
//		int y = mp[i].idy;
//		
//		for (int k = 0; k < 4; k++)
//		{
//			int xx = x + dx[k];
//			int yy = y + dy[k];
//			if (xx >= 1 && xx <= n && yy >= 1 && yy <= m && a[x][y] > a[xx][yy])
//			{
//				f[x][y] = max(f[x][y], f[xx][yy] + 1);
//			}
//			ret = max(ret, f[x][y]);
//		}
//	}
//
//	cout << ret + 1 << endl;
//
//	return 0;
//}



//#include <iostream>
//#include <vector>
//using namespace std;
//
//const int N = 15;
//
//int a[N][N] = { 0 };
//int n;
//vector<int> path;
//bool col[N] = { 0 };
//bool st1[2 * N] = { 0 };
//bool st2[2 * N] = { 0 };
//int ret = 0;
//
//void dfs(int x)
//{
//	if (path.size() == n)
//	{
//		ret++;
//		if (ret <= 3)
//		{
//			for (const auto& ch : path)
//			{
//				cout << ch << " ";
//			}
//			cout << endl;
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		if (col[i] == 1 || st1[x - i + n] == 1 || st2[x + i] == 1)
//			continue;
//		col[i] = 1;
//		st1[x - i + n] = 1;
//		st2[x + i] = 1;
//		path.push_back(i);
//		dfs(x + 1);
//		path.pop_back();
//		col[i] = 0;
//		st1[x - i + n] = 0;
//		st2[x + i] = 0;
//	}
//
//}
//
//int main()
//{
//	cin >> n;
//
//	dfs(1);
//
//	cout << ret << endl;
//	return 0;
//}



//#include <iostream>
//#include <queue>
//using namespace std;
//
//int dx[] = { 0, 0, 1, -1, 1, 1, -1, -1 };
//int dy[] = { 1, -1, 0, 0, 1, -1, 1, -1 };
//
//const int N = 110;
//
//int n, m;
//char a[N][N] = { 0 };
//bool st[N][N] = { 0 };
//int ret = 0;
//
//void bfs(int x, int y)
//{
//	queue<pair<int, int>> q;
//	q.push({ x, y });
//	st[x][y] = 1;
//
//	while (q.size())
//	{
//		pair<int, int> t = q.front();
//		q.pop();
//		int xx = t.first;
//		int yy = t.second;
//
//		for (int k = 0; k < 8; k++)
//		{
//			int i = xx + dx[k];
//			int j = yy + dy[k];
//
//			if (i >= 1 && i <= n && j >= 1 && j <= m && st[i][j] == 0)
//			{
//				st[i][j] = 1;
//				q.push({ i, j });
//			}
//		}
//	}
//}
//
//int main()
//{
//	cin >> n >> m;
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			cin >> a[i][j];
//			if (a[i][j] == '.')
//			{
//				st[i][j] = 1;
//			}
//		}
//	}
//
//	for (int i = 1; i <= n; i++)
//	{
//		for (int j = 1; j <= m; j++)
//		{
//			if (st[i][j] == 0)
//			{
//				bfs(i, j);
//				ret++;
//			}
//		}
//	}
//
//	cout << ret << endl;
//
//	return 0;
//}



#include <iostream>
#include <cstring>
using namespace std;

const int N = 35;

int dx[] = { 0, 0, -1, 1 };
int dy[] = { 1, -1, 0, 0 };

int n;
int a[N][N] = { 0 };

void dfs(int x, int y)
{
	a[x][y] = -1;

	for (int k = 0; k < 4; k++)
	{
		int i = x + dx[k];
		int j = y + dy[k];
		if (i >= 0 && i <= n + 1 && j >= 0 && j <= n + 1 && a[i][j] == 0)
		{
			dfs(i, j);
		}
	}
}

int main()
{
	while (scanf("%d", &n) != EOF)
	{
		memset(a, 0, sizeof(a));
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= n; j++)
			{
				cin >> a[i][j];
			}
		}
		dfs(0, 0);

		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= n; j++)
			{
				if (a[i][j] == -1)
					cout << 0 << " ";
				else if (a[i][j] == 0)
					cout << 2 << " ";
				else
					cout << a[i][j] << " ";
			}
			cout << endl;
		}
	}
	return 0;
}

